package cn.zhfeat.utils.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

import java.util.List;

import org.apache.log4j.Logger;

/**
 * @description:
 *
 * list集合操作类
 * 比较适用于列表式存储且顺序相对比较固定，例如：省份、城市列表  品牌、厂商、车系、车型等列表
 *
 * @author wschenyongyin
 * @param
 * @author ZhangHao
 * @date 2018/10/18 11:31
 * @version 1.0.0.1
 * @return
 */

public class RedisListUtil {
	//private static Jedis jedis = null;
	private static Logger logger = Logger.getLogger(RedisListUtil.class);

	/**
	 * 在名称为key的list尾添加一个值为value的元素
	 * 
	 * @param key
	 * @param value
	 */
	public static void rpush(String key, String value) {
		Jedis jedis = RedisUtil.getJedisObject();
		jedis.rpush(key, value);
		RedisUtil.recycleJedisOjbect(jedis);
	}

	/**
	 * 在名称为key的list头添加一个值为value的 元素
	 *
	 * @param key
	 * @param value
	 */
	public static void lpush(String key, String value) {
		Jedis jedis = RedisUtil.getJedisObject();
		jedis.lpush(key, value);
		RedisUtil.recycleJedisOjbect(jedis);
	}

	/**
	 * 返回名称为key的list的长度
	 *
	 * @param key
	 * @return
	 */
	public static long getListSize(String key) {
		Jedis jedis = RedisUtil.getJedisObject();
		Long size = jedis.llen(key);
		RedisUtil.recycleJedisOjbect(jedis);
		return size;
	}

	/**
	 * 返回名称为key的list中start至end之间的元素（下标从0开始，下同）
	 *
	 * @param key
	 * @param start
	 *            开始元素下标
	 * @param end
	 *            结束元素下标
	 * @return
	 */
	public static List<String> queryDatas(String key, long start, long end) {
		Jedis jedis = RedisUtil.getJedisObject();
		List<String> datas = jedis.lrange(key, start, end);
		RedisUtil.recycleJedisOjbect(jedis);
		return datas;
	}

	/**
	 * 返回名称为key的list中index位置的元素
	 *
	 * @param key
	 * @param index
	 * @return
	 */
	public static String queryData(String key, int index) {
		Jedis jedis = RedisUtil.getJedisObject();
		String data = jedis.lindex(key, index);
		RedisUtil.recycleJedisOjbect(jedis);
		return data;
	}

	/**
	 * 截取名称为key的list，保留start至end之间的元素
	 *
	 * @param key
	 * @param start
	 *            保留元素开始的下标
	 * @param end
	 *            保留元素结束的下标
	 * @return
	 */
	public static List<String> trimData(String key, long start, long end) {
		Jedis jedis = RedisUtil.getJedisObject();
		List<String> datas = jedis.lrange(key, start, end);
		RedisUtil.recycleJedisOjbect(jedis);
		return datas;
	}

	/**
	 * 给名称为key的list中index位置的元素赋值为value
	 *
	 * @param key
	 * @param index
	 *            要修改元素的下标
	 * @param value
	 *            要修改的值
	 */

	public static void updateValue(String key, int index, String value) {
		Jedis jedis = RedisUtil.getJedisObject();
		jedis.lset(key, index, value);
		RedisUtil.recycleJedisOjbect(jedis);
	}

	/**
	 * 删除count个名称为key的list中值为value的元素。count为0，删除所有值为value的元素， count>0
	 * 从头至尾删除count个值为value的元素， count<0从尾到头删除|count|个值为value的元素。
	 *
	 * @param key
	 * @param count
	 * @param value
	 */
	public static void deleDataByValue(String key, int count, String value) {
		Jedis jedis = RedisUtil.getJedisObject();
		jedis.lrem(key, count, value);
		RedisUtil.recycleJedisOjbect(jedis);
	}

	/**
	 * 返回并删除名称为key的list中的首元素
	 *
	 * @param key
	 * @return
	 */
	public static String lpop(String key) {
		Jedis jedis = RedisUtil.getJedisObject();
		String result = jedis.lpop(key);
		RedisUtil.recycleJedisOjbect(jedis);
		return result;
	}

	/**
	 * 返回并删除名称为key的list中的尾元素
	 *
	 * @param key
	 * @return
	 */
	public static String rpop(String key) {
		Jedis jedis = RedisUtil.getJedisObject();
		String result = jedis.rpop(key);
		RedisUtil.recycleJedisOjbect(jedis);
		return result;
	}

	/**
	 * 返回并删除名称为srckey的list的尾元素，并将该元素添加到名称为dstkey的list的头部
	 *
	 * @param srckey
	 * @param dstkey
	 */
	public static String rpoplpush(String srckey, String dstkey) {
		Jedis jedis = RedisUtil.getJedisObject();
		String result = rpoplpush(srckey, dstkey);
		RedisUtil.recycleJedisOjbect(jedis);
		return result;
	}
	/**
	 * 获取名称为key中所有数据
	 * @param key
	 * @return
	 */
	public static List<String> getAllData(String key){
		Jedis jedis = RedisUtil.getJedisObject();
		List<String> datas = jedis.lrange(key, 0, -1);
		RedisUtil.recycleJedisOjbect(jedis);
		return datas;
	}
	/**
	 * 
	* Title: setLargeData
	* Description:批量插入大量数据
	* @param key
	* @param data
	 */
	public static void setLargeData(String key,List<String> data){
		logger.info("redisKey---->"+key);
		logger.info("开始插入redis---->"+data.size());
        Jedis jedis = RedisUtil.getJedisObject();
		Pipeline pipeline = jedis.pipelined();
		for (String value:data) {
			pipeline.lpush(key, value);
		}
		pipeline.sync();
		logger.info("结束插入---》");
		RedisUtil.recycleJedisOjbect(jedis);
    }

}
